package coroutines

import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

fun requestFlow(i: Int): Flow<String> = flow {
    emit("$i: First")
    delay(500) // 等待 500 毫秒
    emit("$i: Second")
}

@ExperimentalCoroutinesApi
@FlowPreview
fun main(){
    val startTime = System.currentTimeMillis()
    runBlocking {
//        (1..3).asFlow().onEach { delay(100) } // 每 100 毫秒发射一个数字
//            .flatMapConcat { requestFlow(it) }
//            .collect { value -> // 收集并打印
//                println("$value at ${System.currentTimeMillis() - startTime} ms from start")
//            }

//        (1..3).asFlow().onEach { delay(100) } // 每 100 毫秒发射一个数字
//            .flatMapMerge { requestFlow(it) }
//            .collect { value -> // 收集并打印
//                println("$value at ${System.currentTimeMillis() - startTime} ms from start")
//            }

        (1..3).asFlow().onEach { delay(100) } // 每 100 毫秒发射一个数字
            .flatMapLatest { requestFlow(it) }
            .collect { value -> // 收集并打印
                println("$value at ${System.currentTimeMillis() - startTime} ms from start")
            }
    }
}